﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using AGPR.Locadora.Data;
using AGPR.Locadora.Utils;

namespace AGPR.Locadora.Model
{
    /// <summary>
    /// Classe de Produto de uma Locação
    /// </summary>
    public class LocacaoProduto
    {
        private static ActiveRecord db = ActiveRecord.Instancia;

        #region Atributos

        #region Database

        /// <summary>
        /// Tabela de Produto da Locação
        /// </summary>
        public const string TABELA = "locacao_produto";

        /// <summary>
        /// VIEW de Produto da Locação
        /// </summary>
        private const string VIEW = "vw_locacao_produto";

        #endregion

        #region Locação

        /// <summary>
        /// Código Interno da Locação
        /// </summary>
        private int _id_locacao;

        /// <summary>
        /// Código da Locação
        /// </summary>
        public int id_locacao
        {
            get
            {
                return this._id_locacao;
            }
            set
            {
                this._id_locacao = value;
            }
        }

        #endregion

        #region Produto

        /// <summary>
        /// Objeto do Produto
        /// </summary>
        public Produto produto;

        /// <summary>
        /// Código Interno do Produto
        /// </summary>
        private int _id_produto;
        
        /// <summary>
        /// Código do Produto
        /// </summary>
        public int id_produto
        {
            get
            {
                return this._id_produto;
            }
            set
            {
                this._id_produto = value;
                this.produto = Produto.Get(value);
            }
        }

        #endregion

        #region Quantidade

        /// <summary>
        /// Quantidade do Produto na Locação
        /// </summary>
        public int qtd { get; set; }

        #endregion

        #region Valor

        /// <summary>
        /// Valor do Produto na Locação (Decimal)
        /// </summary>
        public decimal valor { get; set; }

        /// <summary>
        /// Valor Formatado
        /// </summary>
        [Required]
        [Display(Name = "Valor do Produto")]
        public string valorReais
        {
            get
            {
                return Format.formatarDinheiro(this.valor);
            }
            set
            {
                this.valor = Format.limparDecimal(value);
            }
        }

        #endregion
        
        #endregion

        #region Create

        /// <summary>
        /// Retorna uma instância de LocacaoProduto populada
        /// </summary>
        /// <param name="dados">Dados</param>
        /// <returns>LocacaoProduto</returns>
        public static LocacaoProduto Create(dynamic dados = null)
        {
            LocacaoProduto lp = new LocacaoProduto();

            if (dados != null)
            {
                lp.id_locacao = Convert.ToInt32(dados["id_locacao"]);
                lp.id_produto = Convert.ToInt32(dados["id_produto"]);
                lp.valorReais = Convert.ToString(dados["valor"]);
                lp.qtd = Convert.ToInt32(dados["qtd"]);
            }

            return lp;
        }

        #endregion

        #region Incluir

        /// <summary>
        /// Incluí um produto na locação na Base de Dados
        /// </summary>
        /// <returns>LocacaoProduto</returns>
        public LocacaoProduto Incluir()
        {
            db.insert(TABELA, new Dictionary<string, dynamic>
            {
                {"id_locacao", this.id_locacao},
                {"id_produto", this.id_produto},
                {"qtd", this.qtd},
                {"valor", this.valor}
            });

            return this;
        }

        #endregion

        #region Alterar

        /// <summary>
        /// Altera o Produto da Locação na base de dados
        /// </summary>
        /// <returns>LocacaoProduto</returns>
        public LocacaoProduto Alterar()
        {
            if (this.id_produto > 0)
            {
                db.where("id_locacao", this.id_locacao);
                db.where("id_produto", this.id_produto);
                db.update(TABELA, new Dictionary<string, dynamic>
                {                    
                    {"qtd", this.qtd},
                    {"valor", this.valor}
                });
            }

            return this;
        }

        #endregion

        #region Excluir

        /// <summary>
        /// Exclui um Produto de uma Locação da base de dados
        /// </summary>
        /// <returns>LocacaoProduto</returns>
        public LocacaoProduto Excluir()
        {
            if (this.id_produto > 0)
            {
                db.where("id_locacao", this.id_locacao);
                db.where("id_produto", this.id_produto);
                db.delete(TABELA);
            }

            return this;
        }

        #endregion

        #region Get

        /// <summary>
        /// Retorna um Produto de Locação
        /// </summary>
        /// <param name="id_locacao">Código da Locação</param>
        /// <param name="id_produto">Código do Produto</param>
        /// <returns>LocacaoProduto</returns>
        public static LocacaoProduto Get(dynamic id_locacao, dynamic id_produto)
        {
            db.where("id_locacao", id_locacao);
            db.where("id_produto", id_produto);

            var item = db.selectOne(VIEW);

            return item != null ? LocacaoProduto.Create(item) : null;
        }

        /// <summary>
        /// Retorna uma lista de todos Produtos de uma Locação
        /// </summary>
        /// <param name="id_locacao">Código da Locação</param>
        /// <param name="offset">Offset</param>
        /// <returns>Lista de Produto da Locação</returns>        
        public static List<LocacaoProduto> GetAll(int id_locacao)
        {
            List<LocacaoProduto> itens = new List<LocacaoProduto>();

            db.where("id_locacao", id_locacao);

            foreach (var item in db.select(VIEW))
            {
                itens.Add(LocacaoProduto.Create(item));
            }

            return itens;
        }

        #endregion
    }
}
